/**
 * ScanFile类
 * 44：scanFile方法首先创建若干个分页文件，再读取原始xml文件，将所有记录存放在分页文件中
 * 85：mergefunc方法对指定索引记录文件进行归并排序后划分为若干个索引分页
 * 122：secIndex方法用于生成二级索引记录文件
 */


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;

public class ScanFile {

    /**
     * 构造方法，用于调用对象方法
     */
    public ScanFile(){
        scanFile();
        //mergefunc();
        //secIndex();
    }

    /**
	 * 扫描文件方法，生成记录文件
	 */
	public void scanFile(){
		/*
		//创建分页目录，若要初始化目录则取消注释
		File dir=new File("./data/paging");
		if(!dir.exists()){
			dir.mkdir();
        }
        
		//创建分页文件，若要初始化分页则取消注释
		for(int i=0;i<219;i++){
			String pagepath="./data/paging/page_"+i+".txt";
			File txt=new File(pagepath);
			if(!txt.exists()){
			    try {
				    txt.createNewFile();
			    } catch (IOException e) {
				    e.printStackTrace();
			    }
			}
        }*/
        
        //扫描xml文件内容并装填进分页文件中，若要扫描文件则取消注释
		SAXParserFactory factory=SAXParserFactory.newInstance();
		try {
			SAXParser parser=factory.newSAXParser();
			XMLReader reader=parser.getXMLReader();
			SAXParserHandler handler=new SAXParserHandler();  //新建一个扫描器，关于类定义参见SAXParserHandler.java
			reader.setContentHandler(handler);
			reader.parse("./data/dblp.xml"); //指定扫描目标文件
		}catch(ParserConfigurationException e) {
			e.printStackTrace();
		}catch(SAXException e) {
			e.printStackTrace();
		}catch(IOException e) {
			e.printStackTrace();
		}
    }
    
	/**
	 * 对索引记录文件做归并排序的方法
	 */
	public void mergefunc(){

        String indexpath="./data/author";  //String indexpath="./data/index";
        //创建索引分页所在的目录
		File index=new File(indexpath);
		if(!index.exists()) {
			index.mkdir();
        }
        //创建索引分页文件
		for(int i=0;i<156;i++){  //原始记录索引i递增上限改为219
			String filepath=".data/author/aindex_"+i+".txt";//"./data/index/index_"+i+".txt"
			File txt=new File(filepath);
			if(!txt.exists()){
				try{
					txt.createNewFile();
				}catch(IOException e){
					e.printStackTrace();
				}
			}
        }
        
        //排序开始
		System.out.println("-----SORT START!-----");
		SimpleDateFormat formatter_s= new SimpleDateFormat("yyyy-MM-dd 'at' HH:mm:ss z");
        Date date_s = new Date(System.currentTimeMillis());
        System.out.println(formatter_s.format(date_s));
		new MergeSort(indexpath);  //MergeSort类定义详见MergeSort.java
		System.out.println("-----SORT ACCOMPLISHED!-----");
		SimpleDateFormat formatter_a= new SimpleDateFormat("yyyy-MM-dd 'at' HH:mm:ss z");
        Date date_a = new Date(System.currentTimeMillis());
        System.out.println(formatter_a.format(date_a));
        //排序结束
	}
	
	/**
	 * 依据一级索引得到二级索引的方法
	 */
	public void secIndex(){
		String filepath="./data/author/asecindex.txt";  //String filepath="./data/index/secindex.txt";
		String indexpath="";
        List<String> lis=new ArrayList<String>();
        //创建二级索引文件
		File secindex=new File(filepath);
		if(!secindex.exists()){
			try{
				secindex.createNewFile();
			}catch(IOException e){
				e.printStackTrace();
			}
		}
		
		//读取一级索引头
		for(int i=0;i<156;i++){  //原始记录二级索引i递增上限改为219
			try{
				indexpath="./data/author/aindex_"+i+".txt";  //indexpath="./data/index/index_"+i+".txt";
				String line="";
				File index=new File(indexpath);
			    BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(index),"utf-8"));
                if((line=br.readLine())!=null){
					String[] strarray=line.split("#",2);
                    lis.add(i+" "+strarray[0]);
                	//String[] strarray=line.split(",",2);
                	//lis.add(i+" "+strarray[1]);
				}
				br.close();
			}catch(IOException e){
				e.printStackTrace();
			}
		}
        
        //写入二级索引文件
		BufferedWriter bw;
		try{
            bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(secindex), "utf-8"));
            Iterator<String> it=lis.iterator();
			while(it.hasNext()) {
                String temp=it.next();
				bw.write(temp+"\n");
                bw.flush();
			}
			bw.close();
		}catch(IOException e){
			e.printStackTrace();
		}
	}
}